package mx.itesm.thirstforrevenge;

import java.util.ArrayList;

import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;

/**
 * 
 * @author Raúl Oscar Irene Rivas
 * @author Juan Carlos Felipe Torres
 * @author Victor López
 * @author Ivan Haecker
 * @version 1.1
 * Pantalla especializada para la creacion, posicionamiento y trayectoria del proyectil.
 * 
 */

public class Proyectil {

	private ArrayList<Bitmap> arrayPro;
	private int indice; //El frame actual
	//Coordenadas actuales de X y Y.
	private float movX = 0;
	private float movY = 0;
	//Posici�n inicial del proyectil en X y Y.
	private float posIniX;
	private float posIniY;

	/**
	 * Creación y posicionamiento del proyectil.
	 *  @param Resources, int, int, int  
	 */
	public Proyectil(Resources admRecursos,int []ids,int posicionX, int posicionY){ 
		arrayPro = new ArrayList<Bitmap>();

		for(int id:ids){
			Bitmap bm = BitmapFactory.decodeResource(admRecursos, id);
			arrayPro.add(bm);
		}
		indice=0;

		movX = posicionX;
		movY = posicionY;

		posIniX = posicionX;
		posIniY = posicionY;
	}

	/**
	 * Se crea el canvass para poder dibujar 
	 * @param Canvas, Paint
	 */
	public void draw(Canvas canvas, Paint p){
		canvas.drawBitmap(arrayPro.get(indice), movX, movY, p);
	}


	/**
	 * El proyectil regresa a la posición inicial
	 * @param void
	 */
	public void destruye(){
		movX = posIniX;
		movY = posIniY;
	}


	public void nextFrame() throws InterruptedException{
		indice = (indice + 1) % arrayPro.size();		
	}



	//Esta variable controla la velocidad del Proyectil, mientras m�s grande sea, 
	//m�s lento va a ser.
	private float movFijo = 30;
	//El n�mero de posiciones que se va a mover el proyectil en X y Y.
	private float movFijoX;
	//Valor absoluto de la diferencia de las distancias en X y Y.
	private float distX;
	private float distY;
	//Relaci�n de movimiento de las coordenadas para llegar al destino  con una velocidad
	//determinada por MovFijo.
	private float proporcionX = 0;
	private float proporcionY = 0;

	/**
	 * Trayectoria del disparo del proyectil
	 * @param float, float
	 */
	public void dispara(float xOnTouch,float yOnTouch) throws InterruptedException{
		//Saca el valor absoluto de la diferencia de las posiciones Y.
		if(yOnTouch >= posIniY){
			distY = yOnTouch-posIniY;	
		} else {
			distY = posIniY-yOnTouch;
		}
		//Saca el valor absoluto de la diferencia de las posiciones X.		
		if(xOnTouch >= posIniX){
			distX = xOnTouch-posIniX;	
		} else {
			distX = posIniX-xOnTouch;
		}

		//Determina el valor fijo de X.
		movFijoX = movFijo;

		//Determina la proporcion que se aumenta en X si el X recibido es igual a la 
		//coordenada de origen.
		if(distX == 0){
			proporcionX = 0;
		} else {
			proporcionX = movFijoX;
			//proporcionX = (distX/movFijoX);	
		}

		//Determina la proporcion que se aumenta en Y si el Y recibido es igual a la 
		//coordenada de origen.
		if(distY == 0){
			proporcionY = 0;
		} else {
			proporcionY = (distY/distX)*movFijoX;
		}

		//LLama a los m�todos que cambian la posici�n de coordenadas X y Y del proyectil.
		mueveteX(xOnTouch, proporcionX);
		mueveteY(yOnTouch, proporcionY);
	}

	/**
	 * Se mueve el proyectil en X.
	 * @param float, float
	 */
	public void mueveteX(float x2, float proporcionX) throws InterruptedException{		
		movX += proporcionX;

	}

	/**
	 * Se obtiene la distancia en X.
	 * @param void
	 */
	public float getDistX() {
		return distX;
	}

	/**
	 * Se obtiene la distancia en Y.
	 * @param void
	 */
	public float getDistY() {
		return distY;
	}

	/**
	 * Mueve el proyectil en Y.
	 * @param float, float
	 */
	public void mueveteY(float y2, float proporcionY) throws InterruptedException{
		if (posIniY >= y2){
			movY -= proporcionY;
		}
		if (posIniY < y2) {
			movY += proporcionY;
		}
	}


	/**
	 * Getters y setters del movimiento en X.
	 * @param void
	 */
	public int getMovX() {
		return (int) movX;
	}
	public float getMovY() {
		return movY;
	}
	public void setMovX(int movX) {
		this.movX = movX;
	}
	public void setMovY(int movY) {
		this.movY = movY;
	}

}




